Initialize

using Plots
gr()
Plots.GRBackend()

Lines

A simple line plot of the columns.

plot(Plots.fakedata(50, 5), w=3)
0 10 20 30 40 50 -5.0 -2.5 0.0 2.5 5.0 y1 y2 y3 y4 y5

Functions, adding data, and animations

Plot multiple functions. You can also put the function first, or use the form plot(f, xmin, xmax) where f is a Function or AbstractVector{Function}.

Get series data: x, y = plt[i]. Set series data: plt[i] = (x,y). Add to the series with push!/append!.

Easily build animations. (convert or ffmpeg must be available to generate the animation.) Use command gif(anim, filename, fps=15) to save the animation.

p = plot([sin, cos], zeros(0), leg=false)
anim = Animation()
for x = range(0, stop=10π, length=100)
    push!(p, x, Float64[sin(x), cos(x)])
    frame(anim)
end

Parametric plots

Plot function pair (x(u), y(u)).

plot(sin, (x->begin
            sin(2x)
        end), 0, 2π, line=4, leg=false, fill=(0, :orange))
-1.0 -0.5 0.0 0.5 1.0 -1.0 -0.5 0.0 0.5 1.0

Colors

Access predefined palettes (or build your own with the colorscheme method). Line/marker colors are auto-generated from the plot's palette, unless overridden. Set the z argument to turn on series gradients.

y = rand(100)
plot(0:10:100, rand(11, 4), lab="lines", w=3, palette=:grays, fill=0, α=0.6)
scatter!(y, zcolor=abs.(y .- 0.5), m=(:heat, 0.8, Plots.stroke(1, :green)), ms=10 * abs.(y .- 0.5) .+ 4, lab="grad")
0 25 50 75 100 0.00 0.25 0.50 0.75 1.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 lines lines lines lines grad

Global

Change the guides/background/limits/ticks. Convenience args xaxis and yaxis allow you to pass a tuple or value which will be mapped to the relevant args automatically. The xaxis below will be replaced with xlabel and xlims args automatically during the preprocessing step. You can also use shorthand functions: title!, xaxis!, yaxis!, xlabel!, ylabel!, xlims!, ylims!, xticks!, yticks!

using Statistics
y = rand(20, 3)
plot(y, xaxis=("XLABEL", (-5, 30), 0:2:20, :flip), background_color=RGB(0.2, 0.2, 0.2), leg=false)
hline!(mean(y, dims=1) + rand(1, 3), line=(4, :dash, 0.6, [:lightgreen :green :darkgreen]))
vline!([5, 10])
title!("TITLE")
yaxis!("YLABEL", :log10)
0 2 4 6 8 10 12 14 16 18 20 10 - 2.0 10 - 1.5 10 - 1.0 10 - 0.5 10 0.0 TITLE XLABEL YLABEL

Images

Plot an image. y-axis is set to flipped

import FileIO
path = download("http://juliaplots.org/PlotReferenceImages.jl/Plots/pyplot/0.7.0/ref1.png")
img = FileIO.load(path)
plot(img)
100 200 300 400 500 50 100 150 200 250 300

Arguments

Plot multiple series with different numbers of points. Mix arguments that apply to all series (marker/markersize) with arguments unique to each series (colors). Special arguments line, marker, and fill will automatically figure out what arguments to set (for example, we are setting the linestyle, linewidth, and color arguments with line.) Note that we pass a matrix of colors, and this applies the colors to each series.

ys = Vector[rand(10), rand(20)]
plot(ys, color=[:black :orange], line=(:dot, 4), marker=([:hex :d], 12, 0.8, Plots.stroke(3, :gray)))
5 10 15 20 0.00 0.25 0.50 0.75 1.00 y1 y2

Build plot in pieces

Start with a base plot...

plot(rand(100) / 3, reg=true, fill=(0, :green))
0 25 50 75 100 0.0 0.1 0.2 0.3 y1

and add to it later.

scatter!(rand(100), markersize=6, c=:orange)
0 25 50 75 100 0.00 0.25 0.50 0.75 1.00 y1 y2

Histogram2D

histogram2d(randn(10000), randn(10000), nbins=20)
-4 -2 0 2 4 -4 -2 0 2 4 50 100 150 200 250 300 350

Line types

linetypes = [:path :steppre :steppost :sticks :scatter]
n = length(linetypes)
x = Vector[sort(rand(20)) for i = 1:n]
y = rand(20, n)
plot(x, y, line=(linetypes, 3), lab=map(string, linetypes), ms=15)
0.00 0.25 0.50 0.75 1.00 0.00 0.25 0.50 0.75 1.00 path steppre steppost sticks scatter

Line styles

styles = filter((s->begin
                s in Plots.supported_styles()
            end), [:solid, :dash, :dot, :dashdot, :dashdotdot])
styles = reshape(styles, 1, length(styles))
n = length(styles)
y = cumsum(randn(20, n), dims=1)
plot(y, line=(5, styles), label=map(string, styles), legendtitle="linestyle")
5 10 15 20 -7.5 -5.0 -2.5 0.0 2.5 5.0 linestyle solid dash dot dashdot dashdotdot

Marker types

markers = filter((m->begin
                m in Plots.supported_markers()
            end), Plots._shape_keys)
markers = reshape(markers, 1, length(markers))
n = length(markers)
x = (range(0, stop=10, length=n + 2))[2:end - 1]
y = repeat(reshape(reverse(x), 1, :), n, 1)
scatter(x, y, m=(8, :auto), lab=map(string, markers), bg=:linen, xlim=(0, 10), ylim=(0, 10))
0 2 4 6 8 10 0 2 4 6 8 10 circle rect star5 diamond hexagon cross xcross utriangle dtriangle rtriangle ltriangle pentagon heptagon octagon star4 star6 star7 star8 vline hline + x

Bar

x is the midpoint of the bar. (todo: allow passing of edges instead of midpoints)

bar(randn(99))
0 25 50 75 100 -2 -1 0 1 2 y1

Histogram

histogram(randn(1000), bins=:scott, weights=repeat(1:5, outer=200))
-3 -2 -1 0 1 2 3 0 100 200 300 400 500 y1

Subplots

Use the layout keyword, and optionally the convenient @layout macro to generate arbitrarily complex subplot layouts.

l = @layout([a{0.1h}; b [c; d e]])
plot(randn(100, 5), layout=l, t=[:line :histogram :scatter :steppre :bar], leg=false, ticks=nothing, border=:none)

Adding to subplots

Note here the automatic grid layout, as well as the order in which new series are added to the plots.

plot(Plots.fakedata(100, 10), layout=4, palette=[:grays :blues :heat :lightrainbow], bg_inside=[:orange :pink :darkblue :black])
0 25 50 75 100 -2.5 0.0 2.5 5.0 7.5 y1 y5 y9 0 25 50 75 100 -6 -4 -2 0 2 4 6 y2 y6 y10 0 25 50 75 100 -2 0 2 4 y3 y7 0 25 50 75 100 -6 -3 0 3 6 y4 y8
using Random
Random.seed!(111)
plot!(Plots.fakedata(100, 10))
0 25 50 75 100 -6 -3 0 3 6 y1 y5 y9 y11 y15 y19 0 25 50 75 100 -7.5 -5.0 -2.5 0.0 2.5 5.0 y2 y6 y10 y12 y16 y20 0 25 50 75 100 -2 0 2 4 y3 y7 y13 y17 0 25 50 75 100 -7.5 -5.0 -2.5 0.0 2.5 5.0 7.5 y4 y8 y14 y18

Open/High/Low/Close

Create an OHLC chart. Pass in a list of (open,high,low,close) tuples as your y argument. This uses recipes to first convert the tuples to OHLC objects, and subsequently create a :path series with the appropriate line segments.

n = 20
hgt = rand(n) .+ 1
bot = randn(n)
openpct = rand(n)
closepct = rand(n)
y = OHLC[(openpct[i] * hgt[i] + bot[i], bot[i] + hgt[i], bot[i], closepct[i] * hgt[i] + bot[i]) for i = 1:n]
ohlc(y)
5 10 15 20 -2 -1 0 1 2 y1

Annotations

The annotations keyword is used for text annotations in data-coordinates. Pass in a tuple (x,y,text) or a vector of annotations. annotate!(ann) is shorthand for plot!(; annotation=ann). Series annotations are used for annotating individual data points. They require only the annotation... x/y values are computed. A PlotText object can be build with the method text(string, attr...), which wraps font and color attributes.

y = rand(10)
plot(y, annotations=(3, y[3], Plots.text("this is #3", :left)), leg=false)
annotate!([(5, y[5], Plots.text("this is #5", 16, :red, :center)), (10, y[10], Plots.text("this is #10", :right, 20, "courier"))])
scatter!(range(2, stop=8, length=6), rand(6), marker=(50, 0.2, :orange), series_annotations=["series", "annotations", "map", "to", "series", Plots.text("data", :green)])
2 4 6 8 10 0.2 0.4 0.6 0.8 1.0 series annotations map to series data this is #3 this is #5 this is #10

Custom Markers

A Plots.Shape is a light wrapper around vertices of a polygon. For supported backends, pass arbitrary polygons as the marker shapes. Note: The center is (0,0) and the size is expected to be rougly the area of the unit circle.

verts = [(-1.0, 1.0), (-1.28, 0.6), (-0.2, -1.4), (0.2, -1.4), (1.28, 0.6), (1.0, 1.0), (-1.0, 1.0), (-0.2, -0.6), (0.0, -0.2), (-0.4, 0.6), (1.28, 0.6), (0.2, -1.4), (-0.2, -1.4), (0.6, 0.2), (-0.2, 0.2), (0.0, -0.2), (0.2, 0.2), (-0.2, -0.6)]
x = 0.1:0.2:0.9
y = 0.7 * rand(5) .+ 0.15
plot(x, y, line=(3, :dash, :lightblue), marker=(Shape(verts), 30, RGBA(0, 0, 0, 0.2)), bg=:pink, fg=:darkblue, xlim=(0, 1), ylim=(0, 1), leg=false)
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0

Contours

Any value for fill works here. We first build a filled contour from a function, then an unfilled contour from a matrix.

x = 1:0.5:20
y = 1:0.5:10
f(x, y) = begin
        (3x + y ^ 2) * abs(sin(x) + cos(y))
    end
X = repeat(reshape(x, 1, :), length(y), 1)
Y = repeat(y, 1, length(x))
Z = map(f, X, Y)
p1 = contour(x, y, f, fill=true)
p2 = contour(x, y, Z)
plot(p1, p2)
5 10 15 20 2 4 6 8 10 50 100 150 200 250 5 10 15 20 2 4 6 8 10 50 100 150 200 250

Pie

x = ["Nerds", "Hackers", "Scientists"]
y = [0.4, 0.35, 0.25]
pie(x, y, title="The Julia Community", l=0.5)
The Julia Community Nerds Hackers Scientists

3D

n = 100
ts = range(0, stop=8π, length=n)
x = ts .* map(cos, ts)
y = (0.1ts) .* map(sin, ts)
z = 1:n
plot(x, y, z, zcolor=reverse(z), m=(10, 0.8, :blues, Plots.stroke(0)), leg=false, cbar=true, w=5)
plot!(zeros(n), zeros(n), 1:n, w=10)
-20 -10 0 10 20 -2 -1 0 1 2 0 25 50 75 100 10 20 30 40 50 60 70 80 90 100

Groups and Subplots

group = rand(map((i->begin
                    "group $(i)"
                end), 1:4), 100)
plot(rand(100), layout=@layout([a b; c]), group=group, linetype=[:bar :scatter :steppre], linecolor=:match)
0 25 50 75 100 0.00 0.25 0.50 0.75 1.00 group 1 group 4 20 40 60 80 100 0.2 0.4 0.6 0.8 1.0 group 2 20 40 60 80 100 0.0 0.2 0.4 0.6 0.8 group 3

Polar Plots

Θ = range(0, stop=1.5π, length=100)
r = abs.(0.1 * randn(100) + sin.(3Θ))
plot(Θ, r, proj=:polar, m=2)
0 o 315 o 270 o 225 o 180 o 135 o 90 o 45 o 0.0 0.2 0.4 0.6 0.8 1.0 1.2 y1

Heatmap, categorical axes, and aspect_ratio

xs = [string("x", i) for i = 1:10]
ys = [string("y", i) for i = 1:4]
z = float((1:4) * reshape(1:10, 1, :))
heatmap(xs, ys, z, aspect_ratio=1)
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 y1 y2 y3 y4 5 10 15 20 25 30 35 40

Layouts, margins, label rotation, title location

using Plots.PlotMeasures
plot(rand(100, 6), layout=@layout([a b; c]), title=["A" "B" "C"], title_location=:left, left_margin=[20mm 0mm], bottom_margin=10px, xrotation=60)
0 25 50 75 100 0.00 0.25 0.50 0.75 1.00 A y1 y4 0 25 50 75 100 0.00 0.25 0.50 0.75 1.00 B y2 y5 0 25 50 75 100 0.00 0.25 0.50 0.75 1.00 C y3 y6

Animation with subplots

The layout macro can be used to create an animation with subplots.

l = @layout([[a; b] c])
p = plot(plot([sin, cos], 1, leg=false), scatter([atan, cos], 1, leg=false), plot(log, 1, xlims=(1, 10π), ylims=(0, 5), leg=false), layout=l)
anim = Animation()
for x = range(1, stop=10π, length=100)
    plot(push!(p, x, Float64[sin(x), cos(x), atan(x), cos(x), log(x)]))
    frame(anim)
end

Spy

For a matrix mat with unique nonzeros spy(mat) returns a colorless plot. If mat has various different nonzero values, a colorbar is added. The colorbar can be disabled with legend = nothing.

using SparseArrays
a = spdiagm(0 => ones(50), 1 => ones(49), -1 => ones(49), 10 => ones(40), -10 => ones(40))
b = spdiagm(0 => 1:50, 1 => 1:49, -1 => 1:49, 10 => 1:40, -10 => 1:40)
plot(spy(a), spy(b), title=["Unique nonzeros" "Different nonzeros"])
10 20 30 40 50 10 20 30 40 50 Unique nonzeros 10 20 30 40 50 10 20 30 40 50 Different nonzeros 5 10 15 20 25 30 35 40 45 50

Magic grid argument

The grid lines can be modified individually for each axis with the magic grid argument.

x = rand(10)
p1 = plot(x, title="Default looks")
p2 = plot(x, grid=(:y, :olivedrab, :dot, 1, 0.9), title="Modified y grid")
p3 = plot(deepcopy(p2), title="Add x grid")
xgrid!(p3, :on, :cadetblue, 2, :dashdot, 0.4)
plot(p1, p2, p3, layout=(1, 3), label="", fillrange=0, fillalpha=0.3)
2 4 6 8 10 0.2 0.4 0.6 0.8 1.0 Default looks 2 4 6 8 10 0.2 0.4 0.6 0.8 1.0 Modified y grid 2 4 6 8 10 0.2 0.4 0.6 0.8 1.0 Add x grid

Framestyle

The style of the frame/axes of a (sub)plot can be changed with the framestyle attribute. The default framestyle is :axes.

scatter(fill(randn(10), 6), fill(randn(10), 6), framestyle=[:box :semi :origin :zerolines :grid :none], title=[":box" ":semi" ":origin" ":zerolines" ":grid" ":none"], color=permutedims(1:6), layout=6, label="", markerstrokewidth=0, ticks=-2:2)
-1 0 1 -1 0 :box -1 0 1 -1 0 :semi -1 1 -1 :origin -1 0 1 -1 0 :zerolines -1 0 1 -1 0 :grid :none

Lines and markers with varying colors

You can use the line_z and marker_z properties to associate a color with each line segment or marker in the plot.

t = range(0, stop=1, length=100)
θ = (6π) .* t
x = t .* cos.(θ)
y = t .* sin.(θ)
p1 = plot(x, y, line_z=t, linewidth=3, legend=false)
p2 = scatter(x, y, marker_z=+, color=:bluesreds, legend=false)
plot(p1, p2)
-0.5 0.0 0.5 1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 -0.5 0.0 0.5 1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6

Portfolio Composition maps

see: http://stackoverflow.com/a/37732384/5075246

using Random
Random.seed!(111)
tickers = ["IBM", "Google", "Apple", "Intel"]
N = 10
D = length(tickers)
weights = rand(N, D)
weights ./= sum(weights, dims=2)
returns = sort!((1:N) + D * randn(N))
portfoliocomposition(weights, returns, labels=permutedims(tickers))
0.00 0.25 0.50 0.75 1.00 -2.5 0.0 2.5 5.0 7.5 10.0 12.5 IBM Google Apple Intel

Ribbons

Ribbons can be added to lines via the ribbon keyword; you can pass a tuple of arrays (upper and lower bounds), a single Array (for symmetric ribbons), a Function, or a number.

plot(plot(0:10; ribbon=(LinRange(0, 2, 10), LinRange(0, 1, 10))), plot(0:10; ribbon=0:0.5:5), plot(0:10; ribbon=sqrt), plot(0:10; ribbon=1))
2 4 6 8 10 0.0 2.5 5.0 7.5 10.0 y1 2 4 6 8 10 0 5 10 15 y1 2 4 6 8 10 0 2 4 6 8 10 12 y1 2 4 6 8 10 0.0 2.5 5.0 7.5 10.0 y1

Histogram2D (complex values)

n = 10000
x = exp.(0.1 * randn(n) .+ randn(n) .* im)
histogram2d(x, nbins=(20, 40), show_empty_bins=true, normed=true, aspect_ratio=1)
-2 -1 0 1 2 -1.0 -0.5 0.0 0.5 1.0 Re(x) Im(x) 0 0.25 0.50 0.75 1.00 1.25

Unconnected lines using missing or NaN

Missing values and non-finite values, including NaN, are not plotted. Instead, lines are separated into segments at these values.

(x, y) = ([1, 2, 2, 1, 1], [1, 2, 1, 2, 1])
plot(plot([rand(5); NaN; rand(5); NaN; rand(5)]), plot([1, missing, 2, 3], marker=true), plot([x; NaN; x .+ 2], [y; NaN; y .+ 1], arrow=2), plot([1, 2 + 3im, Inf, 4im, 3, -Inf * im, 0, 3 + 3im], marker=true), legend=false)
3 6 9 12 15 0.2 0.4 0.6 0.8 1 2 3 4 1.0 1.5 2.0 2.5 3.0 1 2 3 4 1.0 1.5 2.0 2.5 3.0 0 1 2 3 0 1 2 3 4 Re(x) Im(x)
  • Supported arguments: annotations, arrow, aspect_ratio, background_color, background_color_inside, background_color_legend, background_color_outside, background_color_subplot, bar_width, bins, bottom_margin, camera, color_palette, colorbar, colorbar_entry, colorbar_title, contour_labels, discrete_values, fill_z, fillalpha, fillcolor, fillrange, flip, foreground_color, foreground_color_axis, foreground_color_border, foreground_color_grid, foreground_color_legend, foreground_color_subplot, foreground_color_text, framestyle, grid, gridalpha, gridlinewidth, gridstyle, group, guide, guidefontcolor, guidefontfamily, guidefonthalign, guidefontrotation, guidefontsize, guidefontvalign, html_output_format, inset_subplots, label, layout, left_margin, legend, legendfontcolor, legendfontfamily, legendfonthalign, legendfontrotation, legendfontsize, legendfontvalign, legendtitle, levels, lims, line_z, linealpha, linecolor, linestyle, linewidth, link, margin, marker_z, markeralpha, markercolor, markershape, markersize, markerstrokealpha, markerstrokecolor, markerstrokewidth, match_dimensions, normalize, orientation, overwrite_figure, polar, primary, projection, quiver, ribbon, right_margin, scale, series_annotations, seriesalpha, seriescolor, seriestype, show, show_empty_bins, size, smooth, subplot, subplot_index, tick_direction, tickfontcolor, tickfontfamily, tickfonthalign, tickfontrotation, tickfontsize, tickfontvalign, ticks, title, titlefontcolor, titlefontfamily, titlefonthalign, titlefontrotation, titlefontsize, titlefontvalign, top_margin, weights, window_title, x, xdiscrete_values, xerror, xflip, xforeground_color_axis, xforeground_color_border, xforeground_color_grid, xforeground_color_text, xgrid, xgridalpha, xgridlinewidth, xgridstyle, xguide, xguidefontcolor, xguidefontfamily, xguidefonthalign, xguidefontrotation, xguidefontsize, xguidefontvalign, xlims, xlink, xscale, xtick_direction, xtickfontcolor, xtickfontfamily, xtickfonthalign, xtickfontrotation, xtickfontsize, xtickfontvalign, xticks, y, ydiscrete_values, yerror, yflip, yforeground_color_axis, yforeground_color_border, yforeground_color_grid, yforeground_color_text, ygrid, ygridalpha, ygridlinewidth, ygridstyle, yguide, yguidefontcolor, yguidefontfamily, yguidefonthalign, yguidefontrotation, yguidefontsize, yguidefontvalign, ylims, ylink, yscale, ytick_direction, ytickfontcolor, ytickfontfamily, ytickfonthalign, ytickfontrotation, ytickfontsize, ytickfontvalign, yticks, z, zdiscrete_values, zflip, zforeground_color_axis, zforeground_color_border, zforeground_color_grid, zforeground_color_text, zgrid, zgridalpha, zgridlinewidth, zgridstyle, zguide, zguidefontcolor, zguidefontfamily, zguidefonthalign, zguidefontrotation, zguidefontsize, zguidefontvalign, zlims, zlink, zscale, ztick_direction, ztickfontcolor, ztickfontfamily, ztickfonthalign, ztickfontrotation, ztickfontsize, ztickfontvalign, zticks
  • Supported values for linetype: :contour, :heatmap, :image, :path, :path3d, :pie, :scatter, :scatter3d, :shape, :straightline, :surface, :volume, :wireframe
  • Supported values for linestyle: :auto, :dash, :dashdot, :dashdotdot, :dot, :solid
  • Supported values for marker: :+, :auto, :circle, :cross, :diamond, :dtriangle, :heptagon, :hexagon, :hline, :ltriangle, :none, :octagon, :pentagon, :rect, :rtriangle, :star4, :star5, :star6, :star7, :star8, :utriangle, :vline, :x, :xcross

(Automatically generated: 2020-03-02T10:17:07.141)